package com.spring.demo11.factory;

import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.lang.Nullable;

import java.util.Locale;

/**
 * org.springframework.context.MessageSource: spring国际化接口
 * <br>
 * 常见3个实现类:
 * ResourceBundleMessageSource: 这个是基于Java的ResourceBundle基础类实现，允许仅通过资源名加载国际化资源
 * ReloadableResourceBundleMessageSource: 这个功能和第一个类的功能类似，多了定时刷新功能，允许在不重启系统的情况下，更新资源的信息
 * StaticMessageSource: 它允许通过编程的方式提供国际化信息，可以通过这个来实现db中存储国际化信息的功能
 *
 * @author vhans
 */
public interface MyMessageSource {
    /**
     * 获取国际化信息
     *
     * @param code           表示国际化资源中的属性名
     * @param args           用于传递格式化串占位符所用的运行期参数
     * @param defaultMessage 当在资源找不到对应属性名时，返回defaultMessage参数所指定的默认信息
     * @param locale         表示本地化对象
     */
    @Nullable
    String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

    /**
     * 与上面的方法类似，只不过在找不到资源中对应的属性名时，直接抛出NoSuchMessageException异常
     */
    String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;

    /**
     * 将属性名、参数数组以及默认信息封装起来，它的功能和第一个方法相同
     */
    String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}
/*
Spring中使用国际化的3个步骤
    通常我们使用spring的时候，都会使用带有ApplicationContext字样的spring容器，这些容器一般是继承了AbstractApplicationContext接口，
而这个接口实现了上面说的国际化接口MessageSource，所以通常我们用到的ApplicationContext类型的容器都自带了国际化的功能。
    通常我们在ApplicationContext类型的容器中使用国际化3个步骤:
        步骤一：创建国际化文件
        步骤二：向容器中注册一个MessageSource类型的bean，bean名称必须为：messageSource
        步骤三：调用AbstractApplicationContext中的getMessage来获取国际化信息，其内部将交给第二步中注册的messageSource名称的bean进行处理
 */